<?php

/**
 * @brief Klasa mapująca dane z bazy danych na obiekty klasy encyjnej Application_Model_OfferStatus.
 *
 * Obiekty tej klasy pośredniczą wymianie danych między bazą danych a obiektami klasy Application_Model_OfferStatus.
 * Za pomocą metod z przypisanej klasy tabeli tworzą obiekty na podstawie danych z bazy danych 
 * oraz zapisują informacje z obiektów do bazy danych.
 * 
 * Dodatkowo klasa ta udostępnia opcję dodania nowego rodzaju statusu i sprawdzenia już istniejących.
 */
class Application_Model_OfferStatusMapper
{
    protected $_dbTable;

    /**
     * @brief Metoda do ustawiania nazwy powiązanej klasy tabel o podanej nazwie.
     * 
     * @param type $dbTable
     * @return Application_Model_OfferStatusMapper 
     */
    public function setDbTable($dbTable) {

        if (is_string($dbTable)) {

            $dbTable = new $dbTable();
        }

        if (!$dbTable instanceof Zend_Db_Table_Abstract) {

            throw new Exception('Invalid table data gateway provided');
        }

        $this->_dbTable = $dbTable;

        return $this;
    }

    /**
     * @brief Metoda zwracająca obiekt powiązanej klasy tabel.
     *  
     * @return Application_Model_DbTable_OfferHasStatus
     */
    public function getDbTable() {

        if (null === $this->_dbTable) {

            $this->setDbTable('Application_Model_DbTable_OfferHasStatus');  
        }

        return $this->_dbTable;
    }

    /**
     * @brief Metoda zapisująca informacje do bazy danych  z obiektu reprezentującego status oferty.
     *
     * Metoda służy zarówno do tworzenia w bazie danych nowych rekordów, jak i aktualizacji starych. 
     * Aktualizacja następuje w przypadku, gdy zostanie wybrana taka opcja.
     * 
     * @param Application_Model_OfferStatus $status
     * @param bool $update 
     */
    public function save(Application_Model_OfferStatus $status, $update = FALSE) { 

        $data = array(
            'status' => $status->getStatus(),
            'Offer_id' => $status->getOffer_id(),
            'endTime' => $status->getEndTime(),
            'startTime' => $status->getStartTime(),
        );


        if (!$update) {
            $this->getDbTable()->insert($data);
        } else {
            unset($data['Offer_id']);
            unset($data['status']);
            $this->getDbTable()->update($data, array('Offer_id = ?' => $status->getOffer_id(),'status = ?' => $status->getStatus())); 
        }
    }


    
    /**
     * @brief Metoda wyszukująca statusy ofert na podstawie danych wejściowych.
     *
     * Metoda wyszukuje statusy ofert  i zwraca tablicę obiektów Application_Model_OfferStatus.
     * Zbiór rekordów uzyskanych z klasy tabel jest przetwarzany przez inną metodę.
     * 
     * @param string $query
     * @return array Application_Model_OfferStatus  
     */
    public function fetchAll($query = NULL) {
        if ($query === NULL) {
            $resultSet = $this->getDbTable()->fetchAll();
            
        } else {
            $table = $this->getDbTable();
            $select = $table->select();
            $select->from($table)
                    ->where($query);

            $resultSet = $this->getDbTable()->fetchAll($select);
        }
        return $this->processResultSet($resultSet);
    }
    
    /**
     * @brief Metoda przetwarza rekordy na obiekty.
     * 
     * @param Zend_Db_Table_Rowset $resultSet
     * @return array Application_Model_OfferStatus 
     */
    private function processResultSet($resultSet) {
        $entries = array();
        foreach ($resultSet as $row) {

            $status = new Application_Model_OfferStatus();

            $status->setOffer_id($row->Offer_id);
            $status->setStatus($row->status);  
            $status->setStartTime($row->startTime);
            $status->setEndTime($row->endTime);
            
            $entries[] = $status;
        }
        return $entries;
    }
    
    /**
     * @brief Metoda zapisująca nowy rodzaj statusu ofert.
     * 
     * @param string $status 
     */
    public function saveNewStatus($status)
    {
        $dbTable = new Application_Model_DbTable_OfferStatus();
        
        $data= array(
            'status'=>$status,
        );
        
        $dbTable->insert($data);
        
        
    }
    
    /**
     * @brief Metoda zwracająca wszystkie rodzaje statusów ofert.
     * 
     * @return array string
     */
    public function fetchAllStatuses()
    {
        $dbTable = new Application_Model_DbTable_OfferStatus();
        $rowSet = $dbTable->fetchAll();
        
        foreach ($rowSet as $row){
            $statuses[] = $row->status;
        }
        return $statuses;
    }

}

